home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / strings.swg / 0135_Re: Convert numbers to letters.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-11-29  |  3.3 KB  |  95 lines

  1. {
  2. Thomas.Papiernik@Thalma.fr says...
  3.  I try to find pascal source to convert numbers to letters like
  4.  100 to one hundred
  5.  
  6. { Copyright 1988, 1995 Roger E. Donais              <RDonais@gnn.com> }
  7.  
  8. { =================================================================== }
  9. { Returns lowercase ordinal for values 1st, 2nd, 3rd, etc             }
  10. { =================================================================== }
  11. FUNCTION OrdNum{ (No: Word): String };
  12. CONST Suffix: Array[0..9] of Array [1..2] of Char =
  13.      ('th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th');
  14. BEGIN
  15.     If (No > 10) and (No < 20) Then
  16.        OrdNum := Ascii(No,1)+'th'
  17.     Else
  18.        OrdNum := Ascii(No,1)+Suffix[No Mod 10];
  19. END;
  20.  
  21.  
  22. { =================================================================== }
  23. { Returns lowercase ordinal for values "first" to "ninety-ninth"      }
  24. { Returns OrnNum() (0th, 100th, 101st, etc) for out-of-range values.  }
  25. { =================================================================== }
  26. FUNCTION Ordinal{ (No: Integer): String };
  27.  
  28. CONST Lo: Array[1..19] of String[11] =
  29.    ( 'first',     'second',     'third',     'fourth',    'fifth',
  30.      'sixth',     'seventh',    'eighth',    'ninth',     'tenth',
  31.      'eleventh',  'twelfth',    'thirteenth','fourteenth','fifteenth',
  32.      'sixteenth', 'seventeenth','eighteenth','nineteenth');
  33.  
  34.       Ten: Array[2..9] of String[5] =
  35.           ( 'twen', 'thir',  'for',  'fif',
  36.             'six',  'seven', 'eigh', 'nine');
  37.  
  38. BEGIN
  39.     If (No < 1) or (No > 99) Then
  40.        Ordinal := OrdNum(No)
  41.     Else
  42.     If No < 20 Then
  43.        Ordinal := Lo[No]
  44.     Else
  45.     If No mod 10 = 0 Then
  46.       Ordinal := Ten[No div 10] + 'tieth'
  47.     Else Ordinal := Ten[No div No] + 'ty-' + Lo[No mod 10];
  48. END;
  49.  
  50. { =================================================================== }
  51. { Returns lowercase number for values 0..MAX_WORD, as "zero", "one",  }
  52. { two, ..., "sixty-five thousand five hundred sixty five.             }
  53. { =================================================================== }
  54. FUNCTION Number(No: Word): String;
  55.  
  56.     Function Num(No: Word): String;
  57.     { --------------------------------------------------------------- }
  58.     CONST Lo: Array[1..19] of String[ 9] =
  59.               ( 'one',     'two',      'three',   'four',    'five',
  60.                 'six',     'seven',    'eight',   'nine',    'ten',
  61.                 'eleven',  'twelve',   'thirteen','fourteen','fifteen',
  62.                 'sixteen', 'seventeen','eighteen','nineteen');
  63.  
  64.           Ten: Array[2..9] of String[5] =
  65.               ( 'twen', 'thir',  'for',  'fif',
  66.                 'six',  'seven', 'eigh', 'nine');
  67.     Begin
  68.         If No < 20 Then Begin
  69.           If No <> 0 Then
  70.              Num := Lo[No]
  71.         End Else
  72.         If No mod 10 = 0 Then
  73.           Num := Ten[No div 10] + 'ty'
  74.         Else Num := Ten[No div 10] + 'ty-' + Lo[No mod 10];
  75.     End;
  76.  
  77. VAR s: String;
  78. BEGIN
  79.     If No = 0 Then
  80.        Number := 'zero'
  81.     Else Begin
  82.        s := '';
  83.        If No >= 2000 Then Begin
  84.           s := Num(No div 1000)+ ' thousand ';
  85.           No := No mod 1000;
  86.        End;
  87.        If No >= 1000 Then Begin
  88.           s := s + Num(No div 100) + ' hundred ';
  89.           No := No mod 100;
  90.        End;
  91.        s := Ftrim(s + Num(No));
  92.     End;
  93.     Number := s;
  94. END;
  95.